home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 02 / wintro5 / db.c next >
C/C++ Source or Header  |  1991-02-28  |  10KB  |  322 lines

  1. /*=================================================================*/
  2. /*                                                                 */
  3. /* File    : DB.C                                                  */
  4. /*                                                                 */
  5. /* Purpose : Simple database routines for the stock charting app   */
  6. /*                                                                 */
  7. /* History :                                                       */
  8. /*                                                                 */
  9. /* (C) Copyright 1989,1990 Marc Adler/Magma Systems                */
  10. /*=================================================================*/
  11.  
  12. #include <string.h>
  13. #include <fcntl.h>
  14. #include <io.h>
  15. #include <sys\types.h>
  16. #include <sys\stat.h>
  17.  
  18. #include "windows.h"
  19. #include "stock.h"
  20.  
  21.  
  22. HANDLE PASCAL StockInfoAlloc(void)
  23. {
  24.   HANDLE hStockInfo;
  25.   LPSTOCKINFO lpStockInfo;
  26.   LPGRAPHINFO lpGraphInfo;
  27.  
  28.   if ((hStockInfo = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 
  29.                                 (DWORD) sizeof(STOCKINFO))) == NULL)
  30.     return NULL;
  31.   if ((lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo)) == NULL)
  32.   {
  33.     MessageBox(hWndMain, "Can't allocate the stock info structure",
  34.                          "Error", MB_OK);
  35.     GlobalFree(hStockInfo);
  36.     return NULL;
  37.   }
  38.  
  39.   lstrcpy(lpStockInfo->szFileName, (LPSTR) "(Untitled)");
  40.  
  41.   /*
  42.    * Set the initial attributes of the graph 
  43.    */
  44.   lpGraphInfo = &lpStockInfo->StockFile.graphinfo;
  45.   lpGraphInfo->dwMinPrice     = 1;
  46.   lpGraphInfo->dwMaxPrice     = 100;
  47.   lpGraphInfo->dwScaleFactor  = 1;
  48.   lpGraphInfo->dwTickInterval = 1;
  49.   lpGraphInfo->iDenominator   = 1;
  50.  
  51.   lpStockInfo->StockFile.dwMagic = MAGIC_COOKIE;
  52.   lpStockInfo->dwFlags |= (STATE_HAS_VGRID | STATE_HAS_HGRID);
  53.   lpStockInfo->graphAttrs.iMappingMode = MM_ISOTROPIC;
  54.   lpStockInfo->graphAttrs.idxPen = 0;
  55.   lpStockInfo->graphAttrs.clrPen = RGB(0x00, 0x00, 0x00);
  56.   lpStockInfo->graphAttrs.idxBackground = 7;
  57.   lpStockInfo->graphAttrs.clrBackground = RGB(0xFF, 0xFF, 0xFF);
  58.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ISOTROPIC, 
  59.                                    MF_BYCOMMAND | MF_CHECKED);
  60.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ANISOTROPIC, 
  61.                                    MF_BYCOMMAND | MF_UNCHECKED);
  62.  
  63.   GlobalUnlock(hStockInfo);
  64.   return hStockInfo;
  65. }
  66.  
  67.  
  68.  
  69. /*******************************************************************/
  70. /*                                                                 */
  71. /* Function : StockFIleRead()                                      */
  72. /*                                                                 */
  73. /* Purpose  : Reads a stock file in from the disk and allocates a  */
  74. /*            stock information structure for it.                  */
  75. /*                                                                 */
  76. /* Returns  : TRUE if the stock file was read, FALSE if not.       */
  77. /*                                                                 */
  78. /*******************************************************************/
  79. int PASCAL
  80. StockFileRead(LPSTR szFileName)
  81. {
  82.   char sz[128];
  83.   int fd;
  84.   int rc = FALSE;
  85.   HANDLE hStockInfo;
  86.   LPSTOCKINFO lpStockInfo;
  87.   LPTICK lpTick;
  88.   HWND hWnd;
  89.  
  90.   /*
  91.    * Make sure it has the .STO extension if the user didn't
  92.    * specify one 
  93.    */
  94.   lstrcpy((LPSTR) sz, szFileName);
  95.   if (!strchr(sz, '.'))
  96.     strcat(sz, ".sto");
  97.  
  98.   /*
  99.    * Open the file for reading 
  100.    */
  101.   if ((fd = _lopen(sz, O_RDONLY | O_BINARY)) < 0)
  102.   {
  103.     MessageBox(hWndMain, "Can't open the stock file for reading",
  104.                          "Error", MB_OK);
  105.     return FALSE;
  106.   }
  107.  
  108.   /*
  109.    * Allocate space for the stock-file header 
  110.    */
  111.   if ((hStockInfo = GlobalAlloc(GMEM_MOVEABLE, 
  112.                                 (DWORD) sizeof(STOCKINFO))) == NULL)
  113.     goto bye;
  114.   if ((lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo)) == NULL)
  115.   {
  116.     MessageBox(hWndMain, "Can't allocate the stock info structure",
  117.                          "Error", MB_OK);
  118.     GlobalFree(hStockInfo);
  119.     goto bye;
  120.   }
  121.  
  122.   /*
  123.    * Save the absolute path name of the file 
  124.    */
  125.   lstrcpy(lpStockInfo->szFileName, (LPSTR) sz);
  126.  
  127.   /*
  128.    * Read the header 
  129.    */
  130.   if (_lread(fd, (LPSTR) & lpStockInfo->StockFile, sizeof(STOCKFILE))
  131.                   != sizeof(STOCKFILE))
  132.   {
  133.     MessageBox(hWndMain, "Bad stock header format", "Error", MB_OK);
  134.     GlobalUnlock(hStockInfo);
  135.     GlobalFree(hStockInfo);
  136.     goto bye;
  137.   }
  138.  
  139.   /*
  140.    * Check the magic number to see if it's really a stock db
  141.    * file 
  142.    */
  143.   if (lpStockInfo->StockFile.dwMagic != MAGIC_COOKIE)
  144.   {
  145.     MessageBox(hWndMain,"The file does not have the right signature",
  146.                         "Error", MB_OK);
  147.     GlobalUnlock(hStockInfo);
  148.     GlobalFree(hStockInfo);
  149.     goto bye;
  150.   }
  151.  
  152.   /*
  153.    * Allocate global memory to hold the ticks 
  154.    */
  155.   if ((lpStockInfo->hTicks = GlobalAlloc(GMEM_MOVEABLE,
  156.          (DWORD)sizeof(TICK)*lpStockInfo->StockFile.nTicks)) == NULL)
  157.   {
  158.     MessageBox(hWndMain, "Can't allocate the ticker array",
  159.                          "Error", MB_OK);
  160.     goto bye;
  161.   }
  162.   lpStockInfo->nTicksAllocated = lpStockInfo->StockFile.nTicks;
  163.   if ((lpTick = (LPTICK) GlobalLock(lpStockInfo->hTicks)) == NULL)
  164.   {
  165.     GlobalFree(lpStockInfo->hTicks);
  166.     goto bye;
  167.   }
  168.  
  169.   /*
  170.    * Read the ticks into the global memory buffer 
  171.    */
  172.   if (_lread(fd, (LPSTR) lpTick, 
  173.                  sizeof(TICK) * lpStockInfo->StockFile.nTicks) !=
  174.                  sizeof(TICK) * lpStockInfo->StockFile.nTicks)
  175.   {
  176.     MessageBox(hWndMain, "Error reading the ticker array",
  177.                          "Error", MB_OK);
  178.     GlobalUnlock(lpStockInfo->hTicks);
  179.     GlobalFree(lpStockInfo->hTicks);
  180.     goto bye;
  181.   }
  182.  
  183.   /*
  184.    * Create a window for this guy 
  185.    */
  186.   hWnd = lpStockInfo->hWnd = GraphCreateWindow((LPSTR) sz);
  187.   SetWindowWord(hWnd, 0, hStockInfo);
  188.   lpStockInfo->dwFlags |= (STATE_HAS_VGRID | STATE_HAS_HGRID);
  189.  
  190.   /*
  191.    * Set the initial attributes of the graph 
  192.    */
  193.   lpStockInfo->graphAttrs.iMappingMode = MM_ISOTROPIC;
  194.   lpStockInfo->graphAttrs.idxPen = 0;
  195.   lpStockInfo->graphAttrs.clrPen = RGB(0x00, 0x00, 0x00);
  196.   lpStockInfo->graphAttrs.idxBackground = 7;
  197.   lpStockInfo->graphAttrs.clrBackground = RGB(0xFF, 0xFF, 0xFF);
  198.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ISOTROPIC, 
  199.                                    MF_BYCOMMAND | MF_CHECKED);
  200.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ANISOTROPIC, 
  201.                                    MF_BYCOMMAND | MF_UNCHECKED);
  202.  
  203.  
  204.   /*
  205.    * Link this entry onto the stock info list 
  206.    */
  207.   hCurrStockInfo = hStockInfo;
  208.  
  209.   GlobalUnlock(lpStockInfo->hTicks);
  210.   GlobalUnlock(hStockInfo);
  211.   rc = TRUE;
  212.  
  213.   /*
  214.    * Done reading .... close the file 
  215.    */
  216. bye:
  217.   close(fd);
  218.  
  219.   InvalidateRect(hWnd, (LPRECT) NULL, FALSE);
  220.   UpdateWindow(hWnd);
  221.   return rc;
  222. }
  223.  
  224.  
  225. int PASCAL
  226. StockFileSave(HANDLE hStockInfo)
  227. {
  228.   int fd;
  229.   char sz[80];
  230.   LPTICK lpTicks;
  231.   LPSTOCKINFO lpStockInfo;
  232.  
  233.   lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo);
  234.   lpTicks = (LPTICK) GlobalLock(lpStockInfo->hTicks);
  235.  
  236.   lstrcpy((LPSTR) sz, lpStockInfo->szFileName);
  237.   strlwr(sz);
  238.   if ((fd = open(sz, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 
  239.                      S_IREAD | S_IWRITE)) < 0)
  240.   {
  241.     MessageBox(hWndMain, "Cannot open file", sz, MB_OK);
  242.     return FALSE;
  243.   }
  244.   _lwrite(fd, (LPSTR) & lpStockInfo->StockFile, sizeof(STOCKFILE));
  245.   _lwrite(fd, (LPSTR) lpTicks, 
  246.               sizeof(TICK) * lpStockInfo->StockFile.nTicks);
  247.   close(fd);
  248.  
  249.   lpStockInfo->dwFlags &= ~STATE_DIRTY;
  250.  
  251.   MessageBox(hWndMain, "The file has been saved", sz, MB_OK);
  252.   return TRUE;
  253. }
  254.  
  255.  
  256. /*******************************************************************/
  257. /*                                                                 */
  258. /* Function : MakeDummyStockFile()                                 */
  259. /*                                                                 */
  260. /* Purpose  : Creates a dummy stock file for testing purposes.     */
  261. /*                                                                 */
  262. /* Returns  :                                                      */
  263. /*                                                                 */
  264. /*******************************************************************/
  265. #define TEST
  266.  
  267. #ifdef TEST
  268.  
  269. STOCKFILE DummyStockInfo =
  270. {
  271.  MAGIC_COOKIE,
  272.  "IBM",
  273.  "Intl Business Machines",
  274.  
  275.  {
  276.   795,                /* dwMinPrice     */
  277.   810,                /* dwMaxPrice     */
  278.   1,                /* dwScaleFactor  */
  279.   1,                /* dwTickInterval */
  280.   1,                /* iDenominator   */
  281.   2                /* iGridPen       */
  282.   },
  283.  
  284.  10                /* nTicks */
  285. };
  286.  
  287. TICK DummyTicks[10] =
  288. {
  289.  {800, 20000L, {1, 1, 90}},
  290.  {802, 20500L, {1, 2, 90}},
  291.  {799, 30000L, {1, 3, 90}},
  292.  {805, 32000L, {1, 4, 90}},
  293.  {802, 28900L, {1, 5, 90}},
  294.  {804, 23500L, {1, 8, 90}},
  295.  {800, 31000L, {1, 9, 90}},
  296.  {801, 23000L, {1, 10, 90}},
  297.  {798, 29500L, {1, 11, 90}},
  298.  {800, 30000L, {1, 12, 90}},
  299. };
  300.  
  301. int
  302. MakeDummyStockFile(LPSTR szFileName)
  303. {
  304.   int fd;
  305.   int i;
  306.   char sz[80];
  307.  
  308.   lstrcpy((LPSTR) sz, szFileName);
  309.  
  310.   if ((fd = open(sz, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 
  311.                      S_IREAD | S_IWRITE)) < 0)
  312.     return FALSE;
  313.  
  314.   write(fd, (char *) &DummyStockInfo, sizeof(DummyStockInfo));
  315.   for (i = 0; i < 10; i++)
  316.     write(fd, (char *) &DummyTicks[i], sizeof(DummyTicks[0]));
  317.  
  318.   close(fd);
  319. }
  320.  
  321. #endif
  322.